#ifndef __THREAD_POOL_H__
#define __THREAD_POOL_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <stdbool.h>
// 描述线程任务
typedef struct tpool_task
{
    void (*function)(void *arg); // 任务函数
    void *arg;                   // 传递给任务函数的参数
} tpool_task_t;

// 描述线程池
typedef struct tpool
{
    tpool_task_t *tp_task; // 指向任务队列

    int tp_qcapacity; // 任务队列容量
    int tp_qsize;     // 当前任务数量

    int tp_front; // 任务队列头
    int tp_rear;  // 任务队列尾

    pthread_t *tp_work_thread_ids; // 存储工作线程ID

    int tp_number_of_threads; // 线程数量

    pthread_mutex_t tp_mutex_pool; // 线程池互斥锁

    pthread_cond_t tp_cond_empty; // 条件变量 任务队列是否为空
    pthread_cond_t tp_cond_full;  // 条件变量 任务队列是否已满

    bool tp_shutdown; // 线程池是否关闭
} tpool_t;

tpool_t *thread_pool_create(int cnt, int queueSize);

void *tp_worker(void *arg);

void thread_pool_add_tasks(tpool_t *pool, void (*task)(void *arg), void *arg);

int thread_pool_destroy(tpool_t *pool);

#endif // __THREAD_POOL_H__